package logica;

import java.io.FileNotFoundException;
import java.io.IOException;
import value_objects.VoInfoPuerto;
import auxiliares.Configuracion;
import auxiliares.Coordenada;

public class Puerto extends ObjetoMapeable {
	private int idPuerto;
	private DanioArma reparArma;
	private int reparBlindaje;
	private int reparVelocidad; 
	private int limiteReparaciones;
	private boolean ocupado;
	
	/**
	 * Constructor normal a partir del id de puerto
	 * @param _idPuerto
	 * @throws IOException 
	 * @throws FileNotFoundException 
	 */
	public Puerto(int _idPuerto) throws FileNotFoundException, IOException {
		idPuerto = _idPuerto;
		incializar();
	}
	
	/**
	 * Constructor normal de puerto
	 * @param _posicion
	 * @param _largo
	 * @param _ancho
	 * @param _idPuerto
	 * @param _reparArma
	 * @param _reparBlindaje
	 * @param _reparVelocidad
	 * @param _limiteReparaciones
	 * @param _ocupado
	 */
	public Puerto( Coordenada _posicion, int _largo, int _ancho, int _idPuerto, DanioArma _reparArma, 
			int _reparBlindaje, int _reparVelocidad, int _limiteReparaciones, boolean _ocupado) {
	
		super(_posicion, _largo, _ancho);
		this.idPuerto = _idPuerto;
		this.reparArma = _reparArma;
		this.reparBlindaje = _reparBlindaje;
		this.reparVelocidad = _reparVelocidad;
		this.limiteReparaciones = _limiteReparaciones;
		this.ocupado = _ocupado;
	}

	/**
	 * Inicializa todos los datos del puerto a partir de su archivo de configuracion 
	 * @param idPuerto
	 * @return
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	private void incializar() throws FileNotFoundException, IOException {
		//Cargar Properties del Puerto segun configuracion
		Configuracion k = Configuracion.getInstancia(Configuracion.CONFIGURACION_POSICIONES);
		Configuracion p = Configuracion.getInstancia(Configuracion.CONFIGURACION_PUERTOS);
		
		int tipoConfig = (int) Math.floor(Math.random() * 3) + 1;
		
		int posicionX = Integer.parseInt(k.getProperty("Puerto" + idPuerto + "CoordX" + String.valueOf(tipoConfig)).trim());
		int posicionY = Integer.parseInt(k.getProperty("Puerto" + idPuerto + "CoordY" + String.valueOf(tipoConfig)).trim());
		setPosicion(posicionX, posicionY);
		setLargo(Integer.parseInt(p.getProperty("Puerto" + idPuerto + "largo").trim())); 
		setAncho(Integer.parseInt(p.getProperty("Puerto" + idPuerto + "ancho").trim())); 
		int _danioAlcance = Integer.parseInt(p.getProperty("Puerto" + idPuerto + "danioAlcance").trim()); 
		int _danioCantMuniciones = Integer.parseInt(p.getProperty("Puerto" + idPuerto + "danioCantMuniciones").trim());
		setReparaArma(new DanioArma(_danioAlcance, _danioCantMuniciones));
		setReparaBlindaje(Integer.parseInt(p.getProperty("Puerto" + idPuerto + "reparBlindaje").trim())); 
		setReparaVelocidad(Integer.parseInt(p.getProperty("Puerto" + idPuerto + "reparVelocidad").trim())); 
		setLimiteReparaciones(Integer.parseInt(p.getProperty("Puerto" + idPuerto + "limiteReparaciones").trim()));
		setOcupado(Boolean.parseBoolean(p.getProperty("Puerto" + idPuerto + "ocupado").trim()));
	}
	
	
	/**
	 * Devuelve la info del puerto útil para el cliente
	 * @return
	 */
	public VoInfoPuerto obtenerInfoPuerto() {
		return new VoInfoPuerto(getIdPuerto(), getPosicion(), getOcupado(), getLimiteReparaciones());
	}

	/**
	 * Devuelve un string conteniendo todas las propiedades del puerto en XML.
	 * @return
	 */
	public String getXML() {
		String ocupado = "false";
		if (getOcupado()) {
			ocupado = "true";
		}
		return  
			"<IdPuerto>" + getIdPuerto() + "</IdPuerto>" +
			"<Largo>" + getLargo() + "</Largo>" +
			"<Ancho>" + getAncho() + "</Ancho>" +
			"<LimiteReparaciones>" + getLimiteReparaciones() + "</LimiteReparaciones>" +
			"<CoordX>" + getPosicion().getCoordX() + "</CoordX>" +
			"<CoordY>" + getPosicion().getCoordY() + "</CoordY>" +
			"<Ocupado>" + ocupado + "</Ocupado>" +
			"<ReparBlindaje>" + getReparBlindaje() + "</ReparBlindaje>" +
			"<ReparVelocidad>" + getReparVelocidad() + "</ReparVelocidad>" +
			"<DanioAlcance>" + getReparArma().getDanioAlncance() + "</DanioAlcance>" +
			"<DanioCantMuniciones>" + getReparArma().getDanioCantMuniciones() + "</DanioCantMuniciones>";
	}
	
	// ********************* GETTERS Y SETTERS *********************
	
	public DanioArma getReparArma() {
		return reparArma;
	}

	public void setReparaArma(DanioArma _reparArma) {
		this.reparArma = _reparArma;
	}

	public int getReparBlindaje() {
		return reparBlindaje;
	}

	public void setReparaBlindaje(int _reparBlindaje) {
		this.reparBlindaje = _reparBlindaje;
	}

	public int getReparVelocidad() {
		return reparVelocidad;
	}

	public void setReparaVelocidad(int _reparVelocidad) {
		this.reparVelocidad = _reparVelocidad;
	}

	public int getLimiteReparaciones() {
		return limiteReparaciones;
	}

	public void setLimiteReparaciones(int _limiteReparaciones) {
		this.limiteReparaciones = _limiteReparaciones;
	}

	public int getIdPuerto() {
		return idPuerto;
	}
	
	public boolean getOcupado() {
		return ocupado;
	}

	public void setOcupado(boolean ocupado) {
		this.ocupado = ocupado;
	}
}
